package com.zjh.config;

import com.zjh.config.UserRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

//给类加上cglib代理，所以执行的是cglib中的代理方法
@Configuration
public class ShiroConfig {

    @Bean(name = "shiroFilterFactoryBean")
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        //添加shiro内置过滤器
        Map<String, String> filterMap = new LinkedHashMap<>();
        // anon:表示可以匿名使用。
        // authc:表示需要认证(登录)才能使用，没有参数
        // user:表示需要使用RememberMe功能才能使用，参数是加密的用户名
        // perms：表示需要某个权限才能使用，参数是以,分隔的权限名字
        // role:表示需要某个角色才能使用，参数是以,分隔的角色名字
        // logical:表示需要某个逻辑才能使用，参数是一个逻辑名字
        //注意：如果认证失败，shiro会抛出异常并跳转到未授权页面

        //授权
        filterMap.put("/user/add", "perms[user:add]");
        filterMap.put("/user/update", "perms[user:update]");

        // filterMap.put("/user/add", "authc");
        // filterMap.put("/user/update", "authc");
        filterMap.put("/user/*", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

        //设置登录页面
        shiroFilterFactoryBean.setLoginUrl("/toLogin");

        //未授权页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");

        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("getUserRealm") UserRealm userRealm) {
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(userRealm);
        return defaultWebSecurityManager;
    }

    @Bean
    public UserRealm getUserRealm() {
        return new UserRealm();
    }

}
